package tree.binarytree;

import java.util.ArrayList;
import java.util.List;

public class BinArrTree {
	public BinArrTree left;

	public BinArrTree right;

	public BinArrTree root;

	/** 数据域 */
	private Object data;

	/** 存节点 */
	public List<BinArrTree> datas;
	 
	public BinArrTree(BinArrTree left, BinArrTree right, Object data){
		this.left = left;
		this.right = right;
		this.data = data;
	}

	/**
	 * @Author chenjiwei
	 * @Description 将初始的左右孩子值为空
	 * @Date 2021/6/8 21:07
	 * @Param
	 * @return
	 */
	public BinArrTree(Object data){
		this(null, null, data);
	}
	 
	public BinArrTree() {
	 
	}
	
	public void buildTree(Object[] objs){
		datas = new ArrayList<BinArrTree>();
//   	将一个数组的值依次转换为Node节点
		for(Object o : objs){
			datas.add(new BinArrTree(o));
		}
//		第一个数为根节点
	 	root = datas.get(0);
//		建立二叉树
	 	for (int i = 0; i < objs.length/2; i++) {
//			左孩子
	    	datas.get(i).left = datas.get(i*2+1);
//			右孩子
	     	if(i*2+2 < datas.size()){//避免偶数的时候 下标越界
	         	datas.get(i).right = datas.get(i*2+2);
	    	}
		}
	}

	/**
	 * @Author chenjiwei
	 * @Description 先序遍历
	 * @Date 2021/6/8 21:07
	 * @Param
	 * @return
	 */
	public void preorder(BinArrTree root){
	    if(root != null){
	        System.out.print(root.data+", ");
	        preorder(root.left);
	        preorder(root.right);
	    }
	}

	/**
	 * @Author chenjiwei
	 * @Description 中序遍历
	 * @Date 2021/6/8 21:07
	 * @Param
	 * @return
	 */
	public void inorder(BinArrTree root){
	 	if(root != null){
	    	inorder(root.left);
	     	System.out.print(root.data+", ");
	    	inorder(root.right);
	   	}
	}

	/**
	 * @Author chenjiwei
	 * @Description 后序遍历
	 * @Date 2021/6/8 21:07
	 * @Param
	 * @return
	 */
	public void afterorder(BinArrTree root){
		if(root != null){
	    	afterorder(root.left);
	    	afterorder(root.right);
	    	System.out.print(root.data+", ");
	  	}
	}

	public static void main(String[] args) {
		BinArrTree bintree = new BinArrTree();
		Object []a = {1,2,3,4,5};
		bintree.buildTree(a);
		bintree.preorder(bintree.root);
		System.out.println();
		bintree.inorder(bintree.root);
		System.out.println();
		bintree.afterorder(bintree.root);
	}

} 
